﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Data;
//using System.Data.OleDb;
//using System.Text.RegularExpressions;

//namespace ASoft.Repository
//{
//    public abstract class ARepository<T> : IRepository<T> where T : class,new()
//    {
//        public virtual void Insert(T entity)
//        {
//            if (Conn.State != ConnectionState.Open)
//            {
//                Conn.Open();
//            }

//            OleDbCommand command = new OleDbCommand(GetInsertSql(entity), Conn);
//            command.ExecuteNonQuery();

//            Conn.Close();
//        }

//        protected virtual string GetInsertSql(T entity)
//        {
//            List<string> columnNames = new List<string>();
//            List<string> columnValues = new List<string>();
//            typeof(T).GetProperties()
//                .Where(p => p.GetCustomAttributes(typeof(EntityColumnAttribute), true).Count() > 0)
//                .ToList()
//                .ForEach(p =>
//                {
//                    columnNames.Add(p.Name);
//                    columnValues.Add(FormatInsertValue(p.GetValue(entity, null)));
//                });
//            return string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
//                TableName,
//                string.Join(",", columnNames.ToArray()),
//                string.Join(",", columnValues.ToArray()));

//        }

//        string FormatInsertValue(object value)
//        {
//            if (value is DateTime)
//            {
//                return "'" + ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss") + "'";
//            }
//            if (value is string)
//            {
//                return "'" + value.ToString().Replace("'", "''") + "'";
//            }
//            return value.ToString();
//        }

//        public virtual IEnumerable<T> GetEntities(Dictionary<string, string> condition)
//        {
//            var result = new List<T>();
//            OleDbCommand command = new OleDbCommand(GetQueryString(condition), Conn);
//            if (Conn.State != System.Data.ConnectionState.Open)
//            {
//                Conn.Open();
//            }
//            var reader = command.ExecuteReader();
//            while (reader.Read())
//            {
//                var t = new T();
//                typeof(T).GetProperties()
//                .Where(p => p.GetCustomAttributes(typeof(EntityColumnAttribute), true).Count() > 0)
//                .ToList()
//                .ForEach(p =>
//                {
//                    var i = reader.GetOrdinal(p.Name);
//                    p.SetValue(t, reader.GetValue(i), null);
//                });
//                result.Add(t);
//            }
//            Conn.Close();
//            return result;
//        }

//        string GetQueryString(Dictionary<string, string> condition)
//        {
//            var andList = new List<string>();
//            foreach (var item in condition)
//            {
//                if (string.IsNullOrWhiteSpace(item.Value))
//                {
//                    continue;
//                }
//                andList.Add(string.Format("({0})", GetOrConditionString(item.Key, item.Value)));
//            }
//            if (andList.Count == 0)
//            {
//                return string.Format("SELECT * FROM {0}", TableName);
//            }
//            else
//            {
//                return string.Format("SELECT * FROM {0} WHERE {1}",
//                    TableName,
//                    string.Join(" AND ", andList.ToArray()));
//            }
//        }

//        string GetOrConditionString(string columnName, string conditionString)
//        {
//            var orList = new List<string>();
//            foreach (Match match in Regex.Matches(conditionString, @"([^,]+)"))
//            {
//                var str = GetRangeConditionString(columnName, match.Value);
//                if (string.IsNullOrWhiteSpace(str))
//                {
//                    orList.Add(string.Format("{0} = {1}", columnName, FormatQueryValue(columnName, match.Value)));
//                }
//                else
//                {
//                    orList.Add(str);
//                }
//            }
//            return string.Join(" OR ", orList.ToArray());

//        }
//        string GetRangeConditionString(string columnName, string conditionString)
//        {
//            if (conditionString.Contains(":"))
//            {
//                var ary = conditionString.Split(':');
//                if (string.IsNullOrWhiteSpace(ary[0]))
//                {
//                    return string.Format("{0} <= {1}", columnName, FormatQueryValue(columnName, ary[1]));
//                }
//                else if (string.IsNullOrWhiteSpace(ary[1]))
//                {
//                    return string.Format("{0} >= {1}", columnName, FormatQueryValue(columnName, ary[0]));
//                }
//                else if (string.IsNullOrWhiteSpace(ary[0]) && string.IsNullOrWhiteSpace(ary[1]))
//                {
//                    return string.Empty;
//                }
//                else
//                {
//                    return string.Format("{0} >= {1} AND {0} <={2}",
//                        columnName,
//                        FormatQueryValue(columnName, ary[0]),
//                        FormatQueryValue(columnName, ary[1]));
//                }
//            }
//            return string.Empty;
//        }

//        string FormatQueryValue(string columnName, string conditionString)
//        {
//            return ColumnFormatDict[columnName.ToLower()](conditionString);
//        }

//        Dictionary<string, Func<string, string>> columnFormatDict = null;
//        Dictionary<string, Func<string, string>> ColumnFormatDict
//        {
//            get
//            {
//                if (columnFormatDict == null)
//                {
//                    columnFormatDict = new Dictionary<string, Func<string, string>>();
//                    typeof(T).GetProperties()
//                        .Where(p => p.GetCustomAttributes(typeof(EntityColumnAttribute), true).Count() > 0)
//                        .ToList()
//                        .ForEach(p =>
//                        {
//                            if (p.PropertyType.Equals(typeof(string)))
//                            {
//                                columnFormatDict[p.Name.ToLower()] = (x) => "'" + x.Replace("'", "''") + "'";
//                            }
//                            else if (p.PropertyType.Equals(typeof(DateTime)))
//                            {
//                                columnFormatDict[p.Name.ToLower()] = (x) => "#" + x.Replace("'", "''") + "#";
//                            }
//                            else
//                            {
//                                columnFormatDict[p.Name.ToLower()] = (x) => x;
//                            }
//                        });
//                }
//                return columnFormatDict;
//            }
//        }

//        protected string AccessConnString
//        {
//            get
//            {
//                //return string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}{1}.mdb;User Id=admin;Password=;",
//                return string.Format("Provider=Microsoft.ace.OLEDB.12.0;Data Source={0}{1}.mdb;User Id=admin;Password=;",
//                    AppUtility.RootPath,
//                    string.IsNullOrWhiteSpace(DBFileName) ? DateTime.Now.Year.ToString() : DBFileName);
//            }
//        }

//        public virtual string DBFileName { get; set; }

//        OleDbConnection _Conn;
//        protected OleDbConnection Conn
//        {
//            get
//            {
//                if (_Conn == null)
//                {
//                    _Conn = new OleDbConnection(AccessConnString);
//                }
//                return _Conn;
//            }
//        }

//        protected virtual string TableName
//        {
//            get
//            {
//                return typeof(T).Name.Replace("Entity", "");
//            }
//        }

//    }
//}
